!
function(t, e) {
    if ("function" == typeof define && define.amd) define(["moment", "jquery", "exports"],
    function(a, i, s) {
        t.daterangepicker = e(t, s, a, i)
    });
    else if ("undefined" != typeof exports) {
        var a, i = require("moment");
        try {
            a = require("jquery")
        } catch(s) {
            if (a = window.jQuery, !a) throw new Error("jQuery dependency not found")
        }
        e(t, exports, i, a)
    } else t.daterangepicker = e(t, {},
    t.moment, t.jQuery || t.Zepto || t.ender || t.$)
} (this,
function(t, e, a, i) {
    var s = function(t, e, a) { ("object" != typeof e || null === e) && (e = {});
        var s = "";
        "string" == typeof e.calender_style && (s = e.calender_style),
        this.parentEl = "body",
        this.element = i(t),
        this.isShowing = !1;
        var n = '<div class="daterangepicker dropdown-menu ' + s + '"><div class="calendar first left"></div><div class="calendar second right"></div><div class="ranges"><div class="range_inputs"><div class="daterangepicker_start_input"><label for="daterangepicker_start"></label><input class="input-mini" type="text" name="daterangepicker_start" value="" /></div><div class="daterangepicker_end_input"><label for="daterangepicker_end"></label><input class="input-mini" type="text" name="daterangepicker_end" value="" /></div><button class="applyBtn" disabled="disabled"></button>&nbsp;<button class="cancelBtn"></button></div></div></div>';
        this.parentEl = i("object" == typeof e && e.parentEl && i(e.parentEl).length ? e.parentEl: this.parentEl),
        this.container = i(n).appendTo(this.parentEl),
        this.setOptions(e, a);
        var r = this.container;
        i.each(this.buttonClasses,
        function(t, e) {
            r.find("button").addClass(e)
        }),
        this.container.find(".daterangepicker_start_input label").html(this.locale.fromLabel),
        this.container.find(".daterangepicker_end_input label").html(this.locale.toLabel),
        this.applyClass.length && this.container.find(".applyBtn").addClass(this.applyClass),
        this.cancelClass.length && this.container.find(".cancelBtn").addClass(this.cancelClass),
        this.container.find(".applyBtn").html(this.locale.applyLabel),
        this.container.find(".cancelBtn").html(this.locale.cancelLabel),
        this.container.find(".calendar").on("click.daterangepicker", ".prev", i.proxy(this.clickPrev, this)).on("click.daterangepicker", ".next", i.proxy(this.clickNext, this)).on("click.daterangepicker", "td.available", i.proxy(this.clickDate, this)).on("mouseenter.daterangepicker", "td.available", i.proxy(this.hoverDate, this)).on("mouseleave.daterangepicker", "td.available", i.proxy(this.updateFormInputs, this)).on("change.daterangepicker", "select.yearselect", i.proxy(this.updateMonthYear, this)).on("change.daterangepicker", "select.monthselect", i.proxy(this.updateMonthYear, this)).on("change.daterangepicker", "select.hourselect,select.minuteselect,select.secondselect,select.ampmselect", i.proxy(this.updateTime, this)),
        this.container.find(".ranges").on("click.daterangepicker", "button.applyBtn", i.proxy(this.clickApply, this)).on("click.daterangepicker", "button.cancelBtn", i.proxy(this.clickCancel, this)).on("click.daterangepicker", ".daterangepicker_start_input,.daterangepicker_end_input", i.proxy(this.showCalendars, this)).on("change.daterangepicker", ".daterangepicker_start_input,.daterangepicker_end_input", i.proxy(this.inputsChanged, this)).on("keydown.daterangepicker", ".daterangepicker_start_input,.daterangepicker_end_input", i.proxy(this.inputsKeydown, this)).on("click.daterangepicker", "li", i.proxy(this.clickRange, this)).on("mouseenter.daterangepicker", "li", i.proxy(this.enterRange, this)).on("mouseleave.daterangepicker", "li", i.proxy(this.updateFormInputs, this)),
        this.element.is("input") ? this.element.on({
            "click.daterangepicker": i.proxy(this.show, this),
            "focus.daterangepicker": i.proxy(this.show, this),
            "keyup.daterangepicker": i.proxy(this.updateFromControl, this)
        }) : this.element.on("click.daterangepicker", i.proxy(this.toggle, this))
    };
    s.prototype = {
        constructor: s,
        setOptions: function(t, e) {
            if (this.startDate = a().startOf("day"), this.endDate = a().endOf("day"), this.timeZone = a().zone(), this.minDate = !1, this.maxDate = !1, this.dateLimit = !1, this.showDropdowns = !1, this.showWeekNumbers = !1, this.timePicker = !1, this.timePickerSeconds = !1, this.timePickerIncrement = 30, this.timePicker12Hour = !0, this.singleDatePicker = !1, this.ranges = {},
            this.opens = "right", this.element.hasClass("pull-right") && (this.opens = "left"), this.buttonClasses = ["btn", "btn-small btn-sm"], this.applyClass = "btn-success", this.cancelClass = "btn-default", this.format = "YYYY-MM-DD", this.separator = "~", this.locale = {
                applyLabel: "确定",
                cancelLabel: "取消",
                fromLabel: "开始",
                toLabel: "结束",
                weekLabel: "W",
                customRangeLabel: "Custom Range",
                daysOfWeek: a.weekdaysMin(),
                monthNames: a.monthsShort(),
                firstDay: a.localeData()._week.dow
            },
            this.cb = function() {},
            "string" == typeof t.format && (this.format = t.format), "string" == typeof t.separator && (this.separator = t.separator), "string" == typeof t.startDate && (this.startDate = a(t.startDate, this.format)), "string" == typeof t.endDate && (this.endDate = a(t.endDate, this.format)), "string" == typeof t.minDate && (this.minDate = a(t.minDate, this.format)), "string" == typeof t.maxDate && (this.maxDate = a(t.maxDate, this.format)), "object" == typeof t.startDate && (this.startDate = a(t.startDate)), "object" == typeof t.endDate && (this.endDate = a(t.endDate)), "object" == typeof t.minDate && (this.minDate = a(t.minDate)), "object" == typeof t.maxDate && (this.maxDate = a(t.maxDate)), "string" == typeof t.applyClass && (this.applyClass = t.applyClass), "string" == typeof t.cancelClass && (this.cancelClass = t.cancelClass), "object" == typeof t.dateLimit && (this.dateLimit = t.dateLimit), "object" == typeof t.locale && ("object" == typeof t.locale.daysOfWeek && (this.locale.daysOfWeek = t.locale.daysOfWeek.slice()), "object" == typeof t.locale.monthNames && (this.locale.monthNames = t.locale.monthNames.slice()), "number" == typeof t.locale.firstDay && (this.locale.firstDay = t.locale.firstDay), "string" == typeof t.locale.applyLabel && (this.locale.applyLabel = t.locale.applyLabel), "string" == typeof t.locale.cancelLabel && (this.locale.cancelLabel = t.locale.cancelLabel), "string" == typeof t.locale.fromLabel && (this.locale.fromLabel = t.locale.fromLabel), "string" == typeof t.locale.toLabel && (this.locale.toLabel = t.locale.toLabel), "string" == typeof t.locale.weekLabel && (this.locale.weekLabel = t.locale.weekLabel), "string" == typeof t.locale.customRangeLabel && (this.locale.customRangeLabel = t.locale.customRangeLabel)), "string" == typeof t.opens && (this.opens = t.opens), "boolean" == typeof t.showWeekNumbers && (this.showWeekNumbers = t.showWeekNumbers), "string" == typeof t.buttonClasses && (this.buttonClasses = [t.buttonClasses]), "object" == typeof t.buttonClasses && (this.buttonClasses = t.buttonClasses), "boolean" == typeof t.showDropdowns && (this.showDropdowns = t.showDropdowns), "boolean" == typeof t.singleDatePicker && (this.singleDatePicker = t.singleDatePicker, this.singleDatePicker && (this.endDate = this.startDate.clone())), "boolean" == typeof t.timePicker && (this.timePicker = t.timePicker), "boolean" == typeof t.timePickerSeconds && (this.timePickerSeconds = t.timePickerSeconds), "number" == typeof t.timePickerIncrement && (this.timePickerIncrement = t.timePickerIncrement), "boolean" == typeof t.timePicker12Hour && (this.timePicker12Hour = t.timePicker12Hour), 0 != this.locale.firstDay) for (var s = this.locale.firstDay; s > 0;) this.locale.daysOfWeek.push(this.locale.daysOfWeek.shift()),
            s--;
            var n, r, o;
            if ("undefined" == typeof t.startDate && "undefined" == typeof t.endDate && i(this.element).is("input[type=text]")) {
                var h = i(this.element).val(),
                l = h.split(this.separator);
                n = r = null,
                2 == l.length ? (n = a(l[0], this.format), r = a(l[1], this.format)) : this.singleDatePicker && "" !== h && (n = a(h, this.format), r = a(h, this.format)),
                null !== n && null !== r && (this.startDate = n, this.endDate = r)
            }
            if ("string" == typeof t.timeZone || "number" == typeof t.timeZone ? (this.timeZone = t.timeZone, this.startDate.zone(this.timeZone), this.endDate.zone(this.timeZone)) : this.timeZone = a(this.startDate).zone(), "object" == typeof t.ranges) {
                for (o in t.ranges) n = "string" == typeof t.ranges[o][0] ? a(t.ranges[o][0], this.format) : a(t.ranges[o][0]),
                r = "string" == typeof t.ranges[o][1] ? a(t.ranges[o][1], this.format) : a(t.ranges[o][1]),
                this.minDate && n.isBefore(this.minDate) && (n = a(this.minDate)),
                this.maxDate && r.isAfter(this.maxDate) && (r = a(this.maxDate)),
                this.minDate && r.isBefore(this.minDate) || this.maxDate && n.isAfter(this.maxDate) || (this.ranges[o] = [n, r]);
                var c = "<ul>";
                for (o in this.ranges) c += "<li>" + o + "</li>";
                c += "<li>" + this.locale.customRangeLabel + "</li>",
                c += "</ul>",
                this.container.find(".ranges ul").remove(),
                this.container.find(".ranges").prepend(c)
            }
            if ("function" == typeof e && (this.cb = e), this.timePicker || (this.startDate = this.startDate.startOf("day"), this.endDate = this.endDate.endOf("day")), this.singleDatePicker ? (this.opens = "right", this.container.addClass("single"), this.container.find(".calendar.right").show(), this.container.find(".calendar.left").hide(), this.timePicker ? this.container.find(".ranges .daterangepicker_start_input, .ranges .daterangepicker_end_input").hide() : this.container.find(".ranges").hide(), this.container.find(".calendar.right").hasClass("single") || this.container.find(".calendar.right").addClass("single")) : (this.container.removeClass("single"), this.container.find(".calendar.right").removeClass("single"), this.container.find(".ranges").show()), this.oldStartDate = this.startDate.clone(), this.oldEndDate = this.endDate.clone(), this.oldChosenLabel = this.chosenLabel, this.leftCalendar = {
                month: a([this.startDate.year(), this.startDate.month(), 1, this.startDate.hour(), this.startDate.minute(), this.startDate.second()]),
                calendar: []
            },
            this.rightCalendar = {
                month: a([this.endDate.year(), this.endDate.month(), 1, this.endDate.hour(), this.endDate.minute(), this.endDate.second()]),
                calendar: []
            },
            "right" == this.opens || "center" == this.opens) {
                var d = this.container.find(".calendar.first"),
                f = this.container.find(".calendar.second");
                f.hasClass("single") && (f.removeClass("single"), d.addClass("single")),
                d.removeClass("left").addClass("right"),
                f.removeClass("right").addClass("left"),
                this.singleDatePicker && (d.show(), f.hide())
            }
            "undefined" != typeof t.ranges || this.singleDatePicker || this.container.addClass("show-calendar"),
            this.container.addClass("opens" + this.opens),
            this.updateView(),
            this.updateCalendars()
        },
        setStartDate: function(t) {
            "string" == typeof t && (this.startDate = a(t, this.format).zone(this.timeZone)),
            "object" == typeof t && (this.startDate = a(t)),
            this.timePicker || (this.startDate = this.startDate.startOf("day")),
            this.oldStartDate = this.startDate.clone(),
            this.updateView(),
            this.updateCalendars(),
            this.updateInputText()
        },
        setEndDate: function(t) {
            "string" == typeof t && (this.endDate = a(t, this.format).zone(this.timeZone)),
            "object" == typeof t && (this.endDate = a(t)),
            this.timePicker || (this.endDate = this.endDate.endOf("day")),
            this.oldEndDate = this.endDate.clone(),
            this.updateView(),
            this.updateCalendars(),
            this.updateInputText()
        },
        updateView: function() {
            this.leftCalendar.month.month(this.startDate.month()).year(this.startDate.year()).hour(this.startDate.hour()).minute(this.startDate.minute()),
            this.rightCalendar.month.month(this.endDate.month()).year(this.endDate.year()).hour(this.endDate.hour()).minute(this.endDate.minute()),
            this.updateFormInputs()
        },
        updateFormInputs: function() {
            this.container.find("input[name=daterangepicker_start]").val(this.startDate.format(this.format)),
            this.container.find("input[name=daterangepicker_end]").val(this.endDate.format(this.format)),
            this.startDate.isSame(this.endDate) || this.startDate.isBefore(this.endDate) ? this.container.find("button.applyBtn").removeAttr("disabled") : this.container.find("button.applyBtn").attr("disabled", "disabled")
        },
        updateFromControl: function() {
            if (this.element.is("input") && this.element.val().length) {
                var t = this.element.val().split(this.separator),
                e = null,
                i = null;
                2 === t.length && (e = a(t[0], this.format).zone(this.timeZone), i = a(t[1], this.format).zone(this.timeZone)),
                (this.singleDatePicker || null === e || null === i) && (e = a(this.element.val(), this.format).zone(this.timeZone), i = e),
                i.isBefore(e) || (this.oldStartDate = this.startDate.clone(), this.oldEndDate = this.endDate.clone(), this.startDate = e, this.endDate = i, this.startDate.isSame(this.oldStartDate) && this.endDate.isSame(this.oldEndDate) || this.notify(), this.updateCalendars())
            }
        },
        notify: function() {
            this.updateView(),
            this.cb(this.startDate, this.endDate, this.chosenLabel)
        },
        move: function() {
            var t = {
                top: 0,
                left: 0
            },
            e = i(window).width();
            this.parentEl.is("body") || (t = {
                top: this.parentEl.offset().top - this.parentEl.scrollTop(),
                left: this.parentEl.offset().left - this.parentEl.scrollLeft()
            },
            e = this.parentEl[0].clientWidth + this.parentEl.offset().left),
            "left" == this.opens ? (this.container.css({
                top: this.element.offset().top + this.element.outerHeight() - t.top,
                right: e - this.element.offset().left - this.element.outerWidth(),
                left: "auto"
            }), this.container.offset().left < 0 && this.container.css({
                right: "auto",
                left: 9
            })) : "center" == this.opens ? (this.container.css({
                top: this.element.offset().top + this.element.outerHeight() - t.top,
                left: this.element.offset().left - t.left + this.element.outerWidth() / 2 - this.container.outerWidth() / 2,
                right: "auto"
            }), this.container.offset().left < 0 && this.container.css({
                right: "auto",
                left: 9
            })) : (this.container.css({
                top: this.element.offset().top + this.element.outerHeight() - t.top,
                left: this.element.offset().left - t.left,
                right: "auto"
            }), this.container.offset().left + this.container.outerWidth() > i(window).width() && this.container.css({
                left: "auto",
                right: 0
            }))
        },
        toggle: function() {
            this.element.hasClass("active") ? this.hide() : this.show()
        },
        show: function() {
            this.isShowing || (this.element.addClass("active"), this.container.show(), this.move(), this._outsideClickProxy = i.proxy(function(t) {
                this.outsideClick(t)
            },
            this), i(document).on("mousedown.daterangepicker", this._outsideClickProxy).on("touchend.daterangepicker", this._outsideClickProxy).on("click.daterangepicker", "[data-toggle=dropdown]", this._outsideClickProxy).on("focusin.daterangepicker", this._outsideClickProxy), this.isShowing = !0, this.element.trigger("show.daterangepicker", this))
        },
        outsideClick: function(t) {
            var e = i(t.target);
            "focusin" == t.type || e.closest(this.element).length || e.closest(this.container).length || e.closest(".calendar-date").length || this.hide()
        },
        hide: function() {
            this.isShowing && (i(document).off(".daterangepicker"), this.element.removeClass("active"), this.container.hide(), this.startDate.isSame(this.oldStartDate) && this.endDate.isSame(this.oldEndDate) || this.notify(), this.oldStartDate = this.startDate.clone(), this.oldEndDate = this.endDate.clone(), this.isShowing = !1, this.element.trigger("hide.daterangepicker", this))
        },
        enterRange: function(t) {
            var e = t.target.innerHTML;
            if (e == this.locale.customRangeLabel) this.updateView();
            else {
                var a = this.ranges[e];
                this.container.find("input[name=daterangepicker_start]").val(a[0].format(this.format)),
                this.container.find("input[name=daterangepicker_end]").val(a[1].format(this.format))
            }
        },
        showCalendars: function() {
            this.container.addClass("show-calendar"),
            this.move(),
            this.element.trigger("showCalendar.daterangepicker", this)
        },
        hideCalendars: function() {
            this.container.removeClass("show-calendar"),
            this.element.trigger("hideCalendar.daterangepicker", this)
        },
        inputsChanged: function(t) {
            var e = i(t.target),
            s = a(e.val(), this.format);
            if (s.isValid()) {
                var n, r;
                "daterangepicker_start" === e.attr("name") ? (n = s, r = this.endDate) : (n = this.startDate, r = s),
                this.setCustomDates(n, r)
            }
        },
        inputsKeydown: function(t) {
            13 === t.keyCode && (this.inputsChanged(t), this.notify())
        },
        updateInputText: function() {
            this.element.is("input") && !this.singleDatePicker ? this.element.val(this.startDate.format(this.format) + this.separator + this.endDate.format(this.format)) : this.element.is("input") && this.element.val(this.endDate.format(this.format))
        },
        clickRange: function(t) {
            var e = t.target.innerHTML;
            if (this.chosenLabel = e, e == this.locale.customRangeLabel) this.showCalendars();
            else {
                var a = this.ranges[e];
                this.startDate = a[0],
                this.endDate = a[1],
                this.timePicker || (this.startDate.startOf("day"), this.endDate.endOf("day")),
                this.leftCalendar.month.month(this.startDate.month()).year(this.startDate.year()).hour(this.startDate.hour()).minute(this.startDate.minute()),
                this.rightCalendar.month.month(this.endDate.month()).year(this.endDate.year()).hour(this.endDate.hour()).minute(this.endDate.minute()),
                this.updateCalendars(),
                this.updateInputText(),
                this.hideCalendars(),
                this.hide(),
                this.element.trigger("apply.daterangepicker", this)
            }
        },
        clickPrev: function(t) {
            var e = i(t.target).parents(".calendar");
            e.hasClass("left") ? this.leftCalendar.month.subtract(1, "month") : this.rightCalendar.month.subtract(1, "month"),
            this.updateCalendars()
        },
        clickNext: function(t) {
            var e = i(t.target).parents(".calendar");
            e.hasClass("left") ? this.leftCalendar.month.add(1, "month") : this.rightCalendar.month.add(1, "month"),
            this.updateCalendars()
        },
        hoverDate: function(t) {
            var e = i(t.target).attr("data-title"),
            a = e.substr(1, 1),
            s = e.substr(3, 1),
            n = i(t.target).parents(".calendar");
            n.hasClass("left") ? this.container.find("input[name=daterangepicker_start]").val(this.leftCalendar.calendar[a][s].format(this.format)) : this.container.find("input[name=daterangepicker_end]").val(this.rightCalendar.calendar[a][s].format(this.format))
        },
        setCustomDates: function(t, e) {
            if (this.chosenLabel = this.locale.customRangeLabel, t.isAfter(e)) {
                var i = this.endDate.diff(this.startDate);
                e = a(t).add(i, "ms")
            }
            this.startDate = t,
            this.endDate = e,
            this.updateView(),
            this.updateCalendars()
        },
        clickDate: function(t) {
            var e, s, n = i(t.target).attr("data-title"),
            r = n.substr(1, 1),
            o = n.substr(3, 1),
            h = i(t.target).parents(".calendar");
            if (h.hasClass("left")) {
                if (e = this.leftCalendar.calendar[r][o], s = this.endDate, "object" == typeof this.dateLimit) {
                    var l = a(e).add(this.dateLimit).startOf("day");
                    s.isAfter(l) && (s = l)
                }
            } else if (e = this.startDate, s = this.rightCalendar.calendar[r][o], "object" == typeof this.dateLimit) {
                var c = a(s).subtract(this.dateLimit).startOf("day");
                e.isBefore(c) && (e = c)
            }
            this.singleDatePicker && h.hasClass("left") ? s = e.clone() : this.singleDatePicker && h.hasClass("right") && (e = s.clone()),
            h.find("td").removeClass("active"),
            i(t.target).addClass("active"),
            this.setCustomDates(e, s),
            this.timePicker || s.endOf("day"),
            this.singleDatePicker && !this.timePicker && this.clickApply()
        },
        clickApply: function() {
            this.updateInputText(),
            this.hide(),
            this.element.trigger("apply.daterangepicker", this)
        },
        clickCancel: function() {
            this.startDate = this.oldStartDate,
            this.endDate = this.oldEndDate,
            this.chosenLabel = this.oldChosenLabel,
            this.updateView(),
            this.updateCalendars(),
            this.hide(),
            this.element.trigger("cancel.daterangepicker", this)
        },
        updateMonthYear: function(t) {
            var e = i(t.target).closest(".calendar").hasClass("left"),
            a = e ? "left": "right",
            s = this.container.find(".calendar." + a),
            n = parseInt(s.find(".monthselect").val(), 10),
            r = s.find(".yearselect").val();
            this[a + "Calendar"].month.month(n).year(r),
            this.updateCalendars()
        },
        updateTime: function(t) {
            var e = i(t.target).closest(".calendar"),
            a = e.hasClass("left"),
            s = parseInt(e.find(".hourselect").val(), 10),
            n = parseInt(e.find(".minuteselect").val(), 10),
            r = 0;
            if (this.timePickerSeconds && (r = parseInt(e.find(".secondselect").val(), 10)), this.timePicker12Hour) {
                var o = e.find(".ampmselect").val();
                "PM" === o && 12 > s && (s += 12),
                "AM" === o && 12 === s && (s = 0)
            }
            if (a) {
                var h = this.startDate.clone();
                h.hour(s),
                h.minute(n),
                h.second(r),
                this.startDate = h,
                this.leftCalendar.month.hour(s).minute(n).second(r),
                this.singleDatePicker && (this.endDate = h.clone())
            } else {
                var l = this.endDate.clone();
                l.hour(s),
                l.minute(n),
                l.second(r),
                this.endDate = l,
                this.singleDatePicker && (this.startDate = l.clone()),
                this.rightCalendar.month.hour(s).minute(n).second(r)
            }
            this.updateView(),
            this.updateCalendars()
        },
        updateCalendars: function() {
            this.leftCalendar.calendar = this.buildCalendar(this.leftCalendar.month.month(), this.leftCalendar.month.year(), this.leftCalendar.month.hour(), this.leftCalendar.month.minute(), this.leftCalendar.month.second(), "left"),
            this.rightCalendar.calendar = this.buildCalendar(this.rightCalendar.month.month(), this.rightCalendar.month.year(), this.rightCalendar.month.hour(), this.rightCalendar.month.minute(), this.rightCalendar.month.second(), "right"),
            this.container.find(".calendar.left").empty().html(this.renderCalendar(this.leftCalendar.calendar, this.startDate, this.minDate, this.maxDate, "left")),
            this.container.find(".calendar.right").empty().html(this.renderCalendar(this.rightCalendar.calendar, this.endDate, this.singleDatePicker ? this.minDate: this.startDate, this.maxDate, "right")),
            this.container.find(".ranges li").removeClass("active");
            var t = !0,
            e = 0;
            for (var a in this.ranges) this.timePicker ? this.startDate.isSame(this.ranges[a][0]) && this.endDate.isSame(this.ranges[a][1]) && (t = !1, this.chosenLabel = this.container.find(".ranges li:eq(" + e + ")").addClass("active").html()) : this.startDate.format("YYYY-MM-DD") == this.ranges[a][0].format("YYYY-MM-DD") && this.endDate.format("YYYY-MM-DD") == this.ranges[a][1].format("YYYY-MM-DD") && (t = !1, this.chosenLabel = this.container.find(".ranges li:eq(" + e + ")").addClass("active").html()),
            e++;
            t && (this.chosenLabel = this.container.find(".ranges li:last").addClass("active").html(), this.showCalendars())
        },
        buildCalendar: function(t, e, i, s, n, r) {
            var o, h = a([e, t]).daysInMonth(),
            l = a([e, t, 1]),
            c = a([e, t, h]),
            d = a(l).subtract(1, "month").month(),
            f = a(l).subtract(1, "month").year(),
            m = a([f, d]).daysInMonth(),
            p = l.day(),
            u = [];
            for (u.firstDay = l, u.lastDay = c, o = 0; 6 > o; o++) u[o] = [];
            var D = m - p + this.locale.firstDay + 1;
            D > m && (D -= 7),
            p == this.locale.firstDay && (D = m - 6);
            var g, y, k = a([f, d, D, 12, s, n]).zone(this.timeZone);
            for (o = 0, g = 0, y = 0; 42 > o; o++, g++, k = a(k).add(24, "hour")) o > 0 && g % 7 === 0 && (g = 0, y++),
            u[y][g] = k.clone().hour(i),
            k.hour(12),
            this.minDate && u[y][g].format("YYYY-MM-DD") == this.minDate.format("YYYY-MM-DD") && u[y][g].isBefore(this.minDate) && "left" == r && (u[y][g] = this.minDate.clone()),
            this.maxDate && u[y][g].format("YYYY-MM-DD") == this.maxDate.format("YYYY-MM-DD") && u[y][g].isAfter(this.maxDate) && "right" == r && (u[y][g] = this.maxDate.clone());
            return u
        },
        renderDropdowns: function(t, e, a) {
            for (var i = t.month(), s = t.year(), n = a && a.year() || s + 5, r = e && e.year() || s - 50, o = '<select class="monthselect">', h = s == r, l = s == n, c = 0; 12 > c; c++)(!h || c >= e.month()) && (!l || c <= a.month()) && (o += "<option value='" + c + "'" + (c === i ? " selected='selected'": "") + ">" + this.locale.monthNames[c] + "</option>");
            o += "</select>";
            for (var d = '<select class="yearselect">',
            f = r; n >= f; f++) d += '<option value="' + f + '"' + (f === s ? ' selected="selected"': "") + ">" + f + "</option>";
            return d += "</select>",
            o + d
        },
        renderCalendar: function(t, e, a, s, n) {
            var r = '<div class="calendar-date">';
            r += '<table class="table-condensed">',
            r += "<thead>",
            r += "<tr>",
            this.showWeekNumbers && (r += "<th></th>"),
            r += !a || a.isBefore(t.firstDay) ? '<th class="prev available"><i class="fa fa-arrow-left icon icon-arrow-left glyphicon glyphicon-arrow-left"></i></th>': "<th></th>";
            var o = this.locale.monthNames[t[1][1].month()] + t[1][1].format(" YYYY");
            this.showDropdowns && (o = this.renderDropdowns(t[1][1], a, s)),
            r += '<th colspan="5" class="month">' + o + "</th>",
            r += !s || s.isAfter(t.lastDay) ? '<th class="next available"><i class="fa fa-arrow-right icon icon-arrow-right glyphicon glyphicon-arrow-right"></i></th>': "<th></th>",
            r += "</tr>",
            r += "<tr>",
            this.showWeekNumbers && (r += '<th class="week">' + this.locale.weekLabel + "</th>"),
            i.each(this.locale.daysOfWeek,
            function(t, e) {
                r += "<th>" + e + "</th>"
            }),
            r += "</tr>",
            r += "</thead>",
            r += "<tbody>";
            for (var h = 0; 6 > h; h++) {
                r += "<tr>",
                this.showWeekNumbers && (r += '<td class="week">' + t[h][0].week() + "</td>");
                for (var l = 0; 7 > l; l++) {
                    var c = "available ";
                    c += t[h][l].month() == t[1][1].month() ? "": "off",
                    a && t[h][l].isBefore(a, "day") || s && t[h][l].isAfter(s, "day") ? c = " off disabled ": t[h][l].format("YYYY-MM-DD") == e.format("YYYY-MM-DD") ? (c += " active ", t[h][l].format("YYYY-MM-DD") == this.startDate.format("YYYY-MM-DD") && (c += " start-date "), t[h][l].format("YYYY-MM-DD") == this.endDate.format("YYYY-MM-DD") && (c += " end-date ")) : t[h][l] >= this.startDate && t[h][l] <= this.endDate && (c += " in-range ", t[h][l].isSame(this.startDate) && (c += " start-date "), t[h][l].isSame(this.endDate) && (c += " end-date "));
                    var d = "r" + h + "c" + l;
                    r += '<td class="' + c.replace(/\s+/g, " ").replace(/^\s?(.*?)\s?$/, "$1") + '" data-title="' + d + '">' + t[h][l].date() + "</td>"
                }
                r += "</tr>"
            }
            r += "</tbody>",
            r += "</table>",
            r += "</div>";
            var f;
            if (this.timePicker) {
                r += '<div class="calendar-time">',
                r += '<select class="hourselect">';
                var m = 0,
                p = 23;
                a && ("left" == n || this.singleDatePicker) && e.format("YYYY-MM-DD") == a.format("YYYY-MM-DD") && (m = a.hour(), e.hour() < m && e.hour(m), this.timePicker12Hour && m >= 12 && e.hour() >= 12 && (m -= 12), this.timePicker12Hour && 12 == m && (m = 1)),
                s && ("right" == n || this.singleDatePicker) && e.format("YYYY-MM-DD") == s.format("YYYY-MM-DD") && (p = s.hour(), e.hour() > p && e.hour(p), this.timePicker12Hour && p >= 12 && e.hour() >= 12 && (p -= 12));
                var u = 0,
                D = 23,
                g = e.hour();
                for (this.timePicker12Hour && (u = 1, D = 12, g >= 12 && (g -= 12), 0 === g && (g = 12)), f = u; D >= f; f++) r += f == g ? '<option value="' + f + '" selected="selected">' + f + "</option>": m > f || f > p ? '<option value="' + f + '" disabled="disabled" class="disabled">' + f + "</option>": '<option value="' + f + '">' + f + "</option>";
                r += "</select> : ",
                r += '<select class="minuteselect">';
                var y = 0,
                k = 59;
                for (a && ("left" == n || this.singleDatePicker) && e.format("YYYY-MM-DD h A") == a.format("YYYY-MM-DD h A") && (y = a.minute(), e.minute() < y && e.minute(y)), s && ("right" == n || this.singleDatePicker) && e.format("YYYY-MM-DD h A") == s.format("YYYY-MM-DD h A") && (k = s.minute(), e.minute() > k && e.minute(k)), f = 0; 60 > f; f += this.timePickerIncrement) {
                    var b = f;
                    10 > b && (b = "0" + b),
                    r += f == e.minute() ? '<option value="' + f + '" selected="selected">' + b + "</option>": y > f || f > k ? '<option value="' + f + '" disabled="disabled" class="disabled">' + b + "</option>": '<option value="' + f + '">' + b + "</option>"
                }
                if (r += "</select> ", this.timePickerSeconds) {
                    for (r += ': <select class="secondselect">', f = 0; 60 > f; f += this.timePickerIncrement) {
                        var b = f;
                        10 > b && (b = "0" + b),
                        r += f == e.second() ? '<option value="' + f + '" selected="selected">' + b + "</option>": '<option value="' + f + '">' + b + "</option>"
                    }
                    r += "</select>"
                }
                if (this.timePicker12Hour) {
                    r += '<select class="ampmselect">';
                    var v = "",
                    C = "";
                    a && ("left" == n || this.singleDatePicker) && e.format("YYYY-MM-DD") == a.format("YYYY-MM-DD") && a.hour() >= 12 && (v = ' disabled="disabled" class="disabled"'),
                    s && ("right" == n || this.singleDatePicker) && e.format("YYYY-MM-DD") == s.format("YYYY-MM-DD") && s.hour() < 12 && (C = ' disabled="disabled" class="disabled"'),
                    r += e.hour() >= 12 ? '<option value="AM"' + v + '>AM</option><option value="PM" selected="selected"' + C + ">PM</option>": '<option value="AM" selected="selected"' + v + '>AM</option><option value="PM"' + C + ">PM</option>",
                    r += "</select>"
                }
                r += "</div>"
            }
            return r
        },
        remove: function() {
            this.container.remove(),
            this.element.off(".daterangepicker"),
            this.element.removeData("daterangepicker")
        }
    },
    i.fn.daterangepicker = function(t, e) {
        return this.each(function() {
            var a = i(this);
            a.data("daterangepicker") && a.data("daterangepicker").remove(),
            a.data("daterangepicker", new s(a, t, e))
        }),
        this
    }
});